//动态规划
class Solution {
public:
    int waysToStep(int n) {
        if(n==1)return 1;
        if(n==2)return 2;
        if(n==3)return 4;
        unsigned int MOD=1000000007;
        vector<int> v(n+1);
        v[1]=1,v[2]=2,v[3]=4;
        for(int i=4;i<=n;i++)
        {
            v[i]=((v[i-1]+v[i-2])%MOD+v[i-3])%MOD;
        }
        return v[n];
    }
};

//滚动数组空间优化
class Solution {
public:
    int waysToStep(int n) {
        if(n==1)return 1;
        if(n==2)return 2;
        if(n==3)return 4;
        unsigned int MOD=1000000007;
        int a=1,b=2,c=4,d=0;
        for(int i=4;i<=n;i++)
        {
            d=((a+b)%MOD+c)%MOD;
            a=b;b=c;c=d;
        }
        return d;
    }
};